# - inputs: none
# - outputs: all sources coming from data, research and guesswork
chunk_sources <- function(){
###############################################################################
###############################################################################
#############
##### Setup
#############
nsims_so <- 1e4
policy_estimate_so <- "Main Equation"
rescale_so <- TRUE
#############
##### Data
#############
# Create objects for data extracted from various sources
r_input1_so <- 0.1
r_input2_so <- 0.2
#############
##### Research
#############
# Create objects for parameters extracted from research papers
q_input1_so <- 0.5
q_input2_so <- 0.8
#############
##### Guess work
#############
# Create objects for variables from educated guesses or estimates
#############
##### Notes:
#############
# Notes for the objects defined above, including sources, explanations, etc.
k_input1_so <- 3
k_input2_so <- 4
#return( sapply( ls(pattern= "_so\\b"), function(x) get(x)) )
return (
list("nsims_so" = nsims_so,
"policy_estimate_so" = policy_estimate_so,
"rescale_so" = rescale_so,
"r_input1_so" = r_input1_so,
"r_input2_so" = r_input2_so,
"q_input1_so" = q_input1_so,
"q_input2_so" = q_input2_so,
"k_input1_so" = k_input1_so,
"k_input2_so" = k_input2_so
)
)
}
invisible(list2env(chunk_sources(),.GlobalEnv) )
Introduction
Summary of the issue and introduction to the policy analysis is conducted.
The goal of this analysis is to provide the best empirical information for policy makers debating the implemention of “x” policy. This document describes all the analytical steps required to reproduce the analysis, and displaying the actual computer code use in each step. In addition to this report, the reader can find all the materials to reproduce the findings presented here in GitHub. The main output, presented in the results section of this report, can also be explored interactively for different assumptions on the corresponding shiny app.
Key policy estimates for policy makers
???
Methodology
Explain what the final estimate indicator is, how the analysis is to be performed, what factors are looked at, etc.
Common Structure
Introduce the starting point and the final policy estimate. Include alternative indicators of our final policy estimates as well.
Main Equation (the model)
Explanation for the main equation
Show all the details
\[\begin{equation}
y = r + q - k
\label{eq:1}
\tag{1}
\end{equation}\]
Where:
- \(y\): one-liner to define y
- \(r\): one-liner to define r
- \(k\): one-liner to define k
Alternative Equation
Explanation for the alternative equation
Show all the details
\[\begin{equation}
y = r + q + k
\label{eq:2}
\tag{2}
\end{equation}\]
Where:
- \(y\): one-liner to define y
- \(r\): one-liner to define r
- \(k\): one-liner to define k
Sub Common Components:
Component 1 (“\(r\)”)
This is the formula used to calculate component 1
Show all the details
\[\begin{equation}
r = X \times \lambda_1 + (1 - X) \times \lambda_2
\label{eq:3}
\tag{3}
\end{equation}\]
Where:
- \(r\): one-liner for r
- \(X\): one-liner for X
- \(\lambda_1\): one-liner for \(\lambda_1\)
- \(\lambda_2\): one-liner for \(\lambda_2\)
Approach 1: Source Name (source link)
Component 2 (“\(q\)”)
This is the formula used to calculate component 2
Show all the details
\[\begin{equation}
q = \text{input} \times \alpha_0 (1 + g)^{X}(1 + \hat{\beta_1} X + \hat{\beta_2} X^2)
\label{eq:}
\tag{4}
\end{equation}\]
Where:
- \(q\): one-liner to define q
- \(\alpha_0\): one-liner to define \(\alpha_0\)
- \(g\): one-liner to define g
- \(\hat{\beta_1}\): one-liner to define \(\hat{\beta_1}\)
- \(\hat{\beta_2}\): one-liner to define \(\hat{\beta_2}\)
Approach 2: Source Name (source link)
Component 3 (“\(k\)”)
This is the formula used to calculate component 3
Show all the details
\[\begin{equation}
k = R \times X + (1 - R) \times X
\label{eq:5}
\tag{5}
\end{equation}\]
Where:
- \(k\): one-liner to define k
- \(R\): one-liner to define R
Summary of All Approaches
| 1.1 |
Specification of Approach 1 with Part 1 Assumption 1 |
Specification of Approach 1 with Part 2 Assumption 1 |
| 1.2 |
Specification of Approach 1 with Part 1 Assumption 2 |
Specification of Aprroach 1 with Part 2 Assumption 2 |
| 2.1 |
Specification of Approach 2 with Part 1 Assumption 1 |
Specification of Approach 2 with Part 2 Assumption 1 |
| 2.2 |
Specification of Approach 2 with Part 1 Assumption 2 |
Specification of Approach 2 with Part 2 Assumption 2 |
Bolded row is the assumptions and the approach we use to generate the main policy estimate plot.
Main results
Show all the details
#unit test function
unit_test_f <- function(to_test_var, original_var, main_run_var = TRUE){
if (main_run_var == TRUE) {
if (length(to_test_var) > 1) {
fails_test <- ( abs(sd(to_test_var) - original_var) > 0.0001 )
text_val <- sd(to_test_var)
} else {
fails_test <- ( abs(to_test_var - original_var) > 0.0001 )
text_val <- to_test_var
}
if (fails_test) {
print(paste("Output has change at",
deparse(substitute(to_test_var) ),
" to ", text_val) )
}
}
}
one_run <-
function(r_input1_var1 = r_input1_so,
r_input2_var1 = r_input2_so,
q_input1_var1 = q_input1_so,
q_input2_var1 = q_input2_so,
k_input1_var1 = k_input1_so,
k_input2_var1 = k_input2_so){# Variables needed to generate the final policy estimates
r_in <- r_function_f(r_input1_var = r_input1_var1,
r_input2_var = r_input2_var1)
q_in <- q_function_f(q_input1_var = q_input1_var1,
q_input2_var = q_input2_var1)
k_in <- k_function_f(k_input1_var = k_input1_var1,
k_input2_var = k_input2_var1)
return (list("r_in" = r_in,
"q_in" = q_in,
"k_in" = k_in))
}
invisible(list2env(one_run(), .GlobalEnv))
# - perform the calculations to achieve final results
result1 <- mainequation_f(r_final_var = r_in,
q_final_var = q_in,
k_final_var = k_in)
result2 <- alternative_f(r_final_var = r_in,
q_final_var = q_in,
k_final_var = k_in)
#...
results_table <- data.frame("results1" = c("results", NA,
NA) ,
"results2" = c(NA, "results", NA),
"results3" = c("results", NA,
"results"),
row.names = c("situation1", "situation2", "situation3"))
kable(results_table, caption = "Table Caption") %>%
kable_styling("striped", full_width = F)
Table 3.1: Table Caption
|
|
results1
|
results2
|
results3
|
|
situation1
|
results
|
NA
|
results
|
|
situation2
|
NA
|
results
|
NA
|
|
situation3
|
NA
|
NA
|
results
|
Monte Carlo Simulations
sim_data1_f <- function(nsims = 1e2,
r_input1_var2,
r_input1_var2_sd,
r_input2_var2,
r_input2_var2_sd,
q_input1_var2,
q_input1_var2_sd,
q_input2_var2,
q_input2_var2_sd,
k_input1_var2,
k_input1_var2_sd,
k_input2_var2,
k_input2_var2_sd){
################
###### Draws
################
start_time <- Sys.time()
set.seed(142857)
r1_sim <- rnorm(n = nsims, mean = r_input1_var2, sd= r_input1_var2_sd)
r2_sim <- rnorm(n = nsims, mean = r_input2_var2, sd= r_input2_var2_sd)
q1_sim <- rnorm(n = nsims, mean = q_input1_var2, sd= q_input1_var2_sd)
q2_sim <- rnorm(n = nsims, mean = q_input2_var2, sd= q_input2_var2_sd)
k1_sim <- rnorm(n = nsims, mean = k_input1_var2, sd= k_input1_var2_sd)
k2_sim <- rnorm(n = nsims, mean = k_input2_var2, sd= k_input2_var2_sd)
################
###### Runs
################
result1_sim <- rep(NA, nsims) #result1
result2_sim <- rep(NA, nsims) #result2
for (i in 1:nsims){
invisible(list2env(
one_run(r_input1_var1 = r1_sim[i],
r_input2_var1 = r2_sim[i],
q_input1_var1 = q1_sim[i],
q_input2_var1 = q2_sim[i],
k_input1_var1 = k1_sim[i],
k_input2_var1 = k2_sim[i]
), .GlobalEnv))
result1_sim[i] <- mainequation_f(r_final_var = r_in,
q_final_var = q_in,
k_final_var = k_in)
result2_sim[i] <- alternative_f(r_final_var = r_in,
q_final_var = q_in,
k_final_var = k_in)
}
total_time <- Sys.time() - start_time
return(list("result1_sim" = result1_sim,
"result2_sim" = result2_sim))
}
policy_estimates_varnames <- c(
"result1_sim",
"result2_sim"
)
policy_estimates_text <- c(
"Main Equation",
"Alternative Equation"
)
# Run Monte Carlo simulation for our main model
result1_sim_all <- sim_data1_f(nsims = nsims_so,
r_input1_var2 = r_input1_so,
r_input1_var2_sd = r_input1_so * 0.1,
r_input2_var2 = r_input2_so,
r_input2_var2_sd = r_input2_so * 0.1,
q_input1_var2 = q_input1_so,
q_input1_var2_sd = q_input1_so * 0.1,
q_input2_var2 = q_input2_so,
q_input2_var2_sd = q_input2_so * 0.1,
k_input1_var2 = k_input1_so,
k_input1_var2_sd = k_input1_so * 0.1,
k_input2_var2 = k_input2_so,
k_input2_var2_sd = k_input2_so * 0.1
)
################
###### Results/Viz
################
library(plotly)
plot1 <- generate_plot_f(result1_sim_all, policy_estimate_so, rescale_so)[[1]] +
labs(y = NULL,
x = "Main Estimate" ,
title = "Project Title",
subtitle = "Distribution of Key Indicator"
)
print(plot1)

References
LS0tDQp0aXRsZTogIjxjZW50ZXI+PGRpdiBjbGFzcz0gJ215dGl0bGUnPlRlbXBsYXRlPC9kaXY+PC9jZW50ZXI+Ig0KZGF0ZTogIjxjZW50ZXI+PGRpdiBjbGFzcz0nbXlzdWJ0aXRsZSc+YHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWA8L2Rpdj48L2NlbnRlcj4iDQphdXRob3I6ICI8Y2VudGVyPjxkaXYgY2xhc3MgPSAnY29udHJpYnV0b3JzJz5Db250cmlidXRvcnM8L2Rpdj48L2NlbnRlcj4iDQpvdXRwdXQ6DQogIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjc3M6IHN0eWxlLmNzcw0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICBpbmNsdWRlczoNCiAgICAgIGFmdGVyX2JvZHk6IGZvb3Rlci5odG1sDQogICAga2VlcF9tZDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiBubw0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIHRvYzogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogbm8NCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnMycNCiAgd29yZF9kb2N1bWVudDogbnVsbA0KbGluay1jaXRhdGlvbnM6IHllcw0KcGRmX2RvY3VtZW50Og0KICBleHRyYV9kZXBlbmRlbmNpZXM6IHhjb2xvcg0KICBmaWdfY2FwdGlvbjogbm8NCmJpYmxpb2dyYXBoeTogYmlibGlvZ3JhcGh5LmJpYg0KDQprbml0OiANCiAgIyByZW5kZXIgdG8gaW5kZXguaHRtbCBmb3IgR2l0SHViIHBhZ2VzDQogICMgcmVuZGVyIHRvIDA1X2ZpbmFsX29wYS5odG1sIHRvIGtuaXQgbG9jYWxseQ0KICAjIFlBTUwgZG9lcyBub3Qgc3VwcG9ydCBjb21tZW50aW5nIGluc2lkZSB0aGUgZnVuY3Rpb24NCiAgKGZ1bmN0aW9uKGlucHV0X2ZpbGUsIGVuY29kaW5nKSB7DQogIHJtYXJrZG93bjo6cmVuZGVyKGlucHV0X2ZpbGUsIGVuY29kaW5nPWVuY29kaW5nLCBvdXRwdXRfZmlsZT1maWxlLnBhdGgoIi4uIiwgJ2luZGV4Lmh0bWwnKSk7IA0KICBybWFya2Rvd246OnJlbmRlcihpbnB1dF9maWxlLCBlbmNvZGluZz1lbmNvZGluZywgb3V0cHV0X2ZpbGU9JzAwX3RlbXBsYXRlLmh0bWwnKTsgDQogIH0pDQotLS0NClxkZWZcYmx1ZXtcY29sb3J7Ymx1ZX19DQpcZGVmXHJlZHtcY29sb3J7cmVkfX0NCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0gDQojIExvYWRpbmcgcmVxdWlyZWQgbGlicmFyaWVzDQpsaXN0Lm9mLnBhY2thZ2VzIDwtIGMoInRpZHl2ZXJzZSIsICJoZXJlIiwgImthYmxlRXh0cmEiLCAicmVhZHhsIiwicGxvdGx5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJib29rZG93biIsICJyb290U29sdmUiLCJzaGlueUJTIiwgInNoaW55dGhlbWVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJnZ3Bsb3QyIikNCg0KbmV3LnBhY2thZ2VzIDwtIGxpc3Qub2YucGFja2FnZXNbIShsaXN0Lm9mLnBhY2thZ2VzICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKClbLCJQYWNrYWdlIl0pXQ0KaWYobGVuZ3RoKG5ldy5wYWNrYWdlcykpIGluc3RhbGwucGFja2FnZXMobmV3LnBhY2thZ2VzLCByZXBvcz0gImh0dHA6Ly9jcmFuLmNuci5iZXJrZWxleS5lZHUvIikNCg0KbGFwcGx5KGxpc3Qub2YucGFja2FnZXMsIGxpYnJhcnksIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCg0Ka25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSBoZXJlKCkpDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQoNCnNldHdkKGhlcmUoKSkNCg0KIyBQdXJsIHRvIGFsbF9hbmFseXNpcy5SDQpvcHRpb25zKGtuaXRyLmR1cGxpY2F0ZS5sYWJlbCA9ICJhbGxvdyIpICMgd29ya2Fyb3VuZCBmb3IgcHVybCBlcnJvcg0Ka25pdHI6OnB1cmwoImNvZGUvMDBfdGVtcGxhdGUuUm1kIiwgImNvZGUvc2hpbnlfYXBwL2FsbF9hbmFseXNpcy5SIikNCg0KcHJpbnRfY29kZSA8LSBUUlVFDQpgYGAgDQoNCg0KYGBge3IgcGFyYW1ldGVycywgZWNobz1wcmludF9jb2RlfQ0KIyBEbyBub3QgcnVuIGRhdGEgc2V0IG9uIGdpdC9naXRodWIgdW50aWwgcHJpdmFjeSBoYXMgYmVlbiBjbGVhcmVkDQojIyMjIyMjIyMjIyMjIyMjDQojIyMjIyBEYXRhICANCiMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIFJlc2VhcmNoDQojIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjDQojIyMjIyBHdWVzcyB3b3JrICAgDQojIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjDQojIyMjIyAgTm90ZXM6DQojIyMjIyMjIyMjIyMjIyMjDQojIyMgU291cmNlIC0tLS0+ICBJbnB1dCAtLS0tPiBNb2RlbCAtLS0tPiBQb2xpY3kgRXN0aW1hdGVzIChvdXRwdXQpDQojIyMgIChfc28pICAgICAgICAoX2luKSAgICAgICAoX21vKSAgICAgICAgKF9wZSkNCiMjIyB2YWx1ZXMgICAgICBmdW5jdGlvbnMgICBmdW5jdGlvbnMgICAgICB2YWx1ZXMNCiMjIyAgICAgICAgICAgICAmIHZhbHVlcyAgICAmIHZhbHVlcw0KIyMjIGFyZ3VtZW50cyBpbiBmdW5jdGlvbnMgc2hvdWxkIHVzZWQgIl92YXIiIGFuZCBmdW5jdGlvbnMgc2hvdWxkICJfZiINCiNpbnZpc2libGUoIGxpc3QyZW52KGNhbGxfcGFyYW1zX2YoKSwuR2xvYmFsRW52KSApDQoNCg0KIyBFYWNoIGFuYWx5dGljIGNvZGUgY2h1bmsgd2lsbCBiZWdpbiBieSBsaXN0aW5nIGFsbCB0aGUgaW5wdXRzIGl0IG5lZWRzLCBhbmQNCiMgdGhlIG91dHB1dHMgaXQgcHJvZHVjZXMuDQojIC0gaW5wdXRzOiBsaXN0DQojIC0gb3V0cHV0czogbGlzdA0KIyMjIyBUaGUga2V5IGVzc2VudGlhbCBhbmFseXRpYyBzdGVwcyBhcmUgd3JhcHRlZCBpbiBhIGZ1bmN0aW9uICAgDQojY2h1bmtfbmFtZV9vZl9jaHVuayA8LSBmdW5jdGlvbigpew0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIA0KIw0KIyBoZXJlIGdvZXMgdGhlIGVzc2VudGlhbCBhbmFseXRpYyBjb250ZW50DQojDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgDQojICAgIHJldHVybiggKSAgICAgICAgICAgICAgICAgICAgICAgICAjIEEgbGlzdCB3aXRoIGFsbCB0aGUgb2JqZWN0cw0KI30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBnZW5lcmF0ZWQgaW5zaWRlIHRoZSBmdW5jdGlvbg0KIyBUaGUgZm9sbG93aW5nIGxpbmUgZXhlY3V0ZXMgdGhlIGNvZGUgY2h1bmsgYW5kIGRlcG9zaXRzIGl0cyByZXN1bHRzDQojIGludG8gdGhlIGN1cnJlbnQgUiBlbnZpb3JubWVudDoNCiNpbnZpc2libGUoIGxpc3QyZW52KGNodW5rX25hbWVfb2ZfY2h1bmsoKSwuR2xvYmFsRW52KSApDQojDQojIyMjIyBFeGVjdXRlIHZhbHVlcyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIHdoZW4gbmVlZGVkIGZvciB0aGUgdGV4dDoNCiMgQW55dGhpbmcgdW5kZXIgdGhpcyBjb21tZW50IGlzIHRvIGNyZWF0ZSBvYmplY3RzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGJvZHkgb2YNCiMgdGV4dC4gTm90IHRvIGJlIHVzZWQgaW4gdGhlIGZpbmFsIHJlc3VsdHMgKGNvdWxkIGJlIGRlbGV0ZWQpLiBFYWNoIG9mIHRoZXNlDQojIG9iamVjdCBzaG91bGQgZW5kIHdpdGggdGhlIHN1ZmZpeCBfdGVtcA0KDQpgYGANCg0KDQpgYGB7ciBzb3VyY2VzLCBldmFsID0gVFJVRSwgZWNobz1wcmludF9jb2RlLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyAtIGlucHV0czogbm9uZQ0KIyAtIG91dHB1dHM6IGFsbCBzb3VyY2VzIGNvbWluZyBmcm9tIGRhdGEsIHJlc2VhcmNoIGFuZCBndWVzc3dvcmsNCmNodW5rX3NvdXJjZXMgPC0gZnVuY3Rpb24oKXsNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICAgIyMjIyMjIyMjIyMjIw0KICAgICMjIyMjIFNldHVwDQogICAgIyMjIyMjIyMjIyMjIyAgDQogICAgbnNpbXNfc28gPC0gMWU0DQogICAgcG9saWN5X2VzdGltYXRlX3NvIDwtICJNYWluIEVxdWF0aW9uIg0KICAgIHJlc2NhbGVfc28gPC0gVFJVRQ0KICAgICMjIyMjIyMjIyMjIyMNCiAgICAjIyMjIyBEYXRhICANCiAgICAjIyMjIyMjIyMjIyMjDQogICAgDQogICMgQ3JlYXRlIG9iamVjdHMgZm9yIGRhdGEgZXh0cmFjdGVkIGZyb20gdmFyaW91cyBzb3VyY2VzDQogICAgDQogICAgcl9pbnB1dDFfc28gPC0gMC4xDQogICAgcl9pbnB1dDJfc28gPC0gMC4yDQogICAgIyMjIyMjIyMjIyMjIw0KICAgICMjIyMjIFJlc2VhcmNoDQogICAgIyMjIyMjIyMjIyMjIw0KICANCiAgIyBDcmVhdGUgb2JqZWN0cyBmb3IgcGFyYW1ldGVycyBleHRyYWN0ZWQgZnJvbSByZXNlYXJjaCBwYXBlcnMgDQogICAgcV9pbnB1dDFfc28gPC0gMC41DQogICAgcV9pbnB1dDJfc28gPC0gMC44DQogICAgIyMjIyMjIyMjIyMjIw0KICAgICMjIyMjIEd1ZXNzIHdvcmsgICANCiAgICAjIyMjIyMjIyMjIyMjDQogIA0KICAjIENyZWF0ZSBvYmplY3RzIGZvciB2YXJpYWJsZXMgZnJvbSBlZHVjYXRlZCBndWVzc2VzIG9yIGVzdGltYXRlcyAgDQogIA0KDQogICAgIyMjIyMjIyMjIyMjIw0KICAgICMjIyMjIE5vdGVzOiANCiAgICAjIyMjIyMjIyMjIyMjDQogIA0KICAjIE5vdGVzIGZvciB0aGUgb2JqZWN0cyBkZWZpbmVkIGFib3ZlLCBpbmNsdWRpbmcgc291cmNlcywgZXhwbGFuYXRpb25zLCBldGMuIA0KICAgIGtfaW5wdXQxX3NvIDwtIDMNCiAgICBrX2lucHV0Ml9zbyA8LSA0DQogICAgDQogICAgI3JldHVybiggc2FwcGx5KCBscyhwYXR0ZXJuPSAiX3NvXFxiIiksIGZ1bmN0aW9uKHgpIGdldCh4KSkgKQ0KICAgIHJldHVybiAoDQogICAgICBsaXN0KCJuc2ltc19zbyIgPSBuc2ltc19zbywNCiAgICAgICAgICAgInBvbGljeV9lc3RpbWF0ZV9zbyIgPSBwb2xpY3lfZXN0aW1hdGVfc28sDQogICAgICAgICAgICJyZXNjYWxlX3NvIiA9IHJlc2NhbGVfc28sDQogICAgICAgICAgICJyX2lucHV0MV9zbyIgPSByX2lucHV0MV9zbywNCiAgICAgICAgICAgInJfaW5wdXQyX3NvIiA9IHJfaW5wdXQyX3NvLA0KICAgICAgICAgICAicV9pbnB1dDFfc28iID0gcV9pbnB1dDFfc28sDQogICAgICAgICAgICJxX2lucHV0Ml9zbyIgPSBxX2lucHV0Ml9zbywNCiAgICAgICAgICAgImtfaW5wdXQxX3NvIiA9IGtfaW5wdXQxX3NvLA0KICAgICAgICAgICAia19pbnB1dDJfc28iID0ga19pbnB1dDJfc28NCiAgICAgICAgICAgKQ0KICAgICkNCn0NCmludmlzaWJsZShsaXN0MmVudihjaHVua19zb3VyY2VzKCksLkdsb2JhbEVudikgKQ0KYGBgDQoNCiMgSW50cm9kdWN0aW9uDQpTdW1tYXJ5IG9mIHRoZSBpc3N1ZSBhbmQgaW50cm9kdWN0aW9uIHRvIHRoZSBwb2xpY3kgYW5hbHlzaXMgaXMgY29uZHVjdGVkLiANCg0KVGhlIGdvYWwgb2YgdGhpcyBhbmFseXNpcyBpcyB0byBwcm92aWRlIHRoZSBiZXN0IGVtcGlyaWNhbCBpbmZvcm1hdGlvbiBmb3IgcG9saWN5IG1ha2VycyBkZWJhdGluZyB0aGUgaW1wbGVtZW50aW9uIG9mICJ4IiBwb2xpY3kuIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGFsbCB0aGUgYW5hbHl0aWNhbCBzdGVwcyByZXF1aXJlZCB0byByZXByb2R1Y2UgdGhlIGFuYWx5c2lzLCBhbmQgZGlzcGxheWluZyB0aGUgYWN0dWFsIGNvbXB1dGVyIGNvZGUgdXNlIGluIGVhY2ggc3RlcC4gSW4gYWRkaXRpb24gdG8gdGhpcyByZXBvcnQsIHRoZSByZWFkZXIgY2FuIGZpbmQgYWxsIHRoZSBtYXRlcmlhbHMgdG8gcmVwcm9kdWNlIHRoZSBmaW5kaW5ncyBwcmVzZW50ZWQgaGVyZSBpbiBHaXRIdWIuIFRoZSBtYWluIG91dHB1dCwgcHJlc2VudGVkIGluIHRoZSByZXN1bHRzIHNlY3Rpb24gb2YgdGhpcyByZXBvcnQsIGNhbiBhbHNvIGJlIGV4cGxvcmVkIGludGVyYWN0aXZlbHkgZm9yIGRpZmZlcmVudCBhc3N1bXB0aW9ucyBvbiB0aGUgY29ycmVzcG9uZGluZyBzaGlueSBhcHAuIA0KDQojIyBTb3VyY2UgSW5mb3JtYXRpb24gZm9yIGRhdGEgKyBhbmFseXRpY2FsIG1ldGhvZHMNCg0KRm9yIHRoaXMgZHluYW1pYyBkb2N1bWVudCwgd2UgYXJlIGNvbmR1Y3RpbmcgdGhpcyBzcGVjaWZpYyBhbmFseXNpcywgYW5kIGl0IGlzIGNvbXB1dGVkIHVzaW5nIHRocmVlIGRpZmZlcmVudCBhcHByb2FjaGVzOg0KDQoxLiBBcHByb2FjaCAxIChzb3VyY2UgbGluaykNCjIuIEFwcHJvYWNoIDIgKHNvdXJjZSBsaW5rKQ0KMy4gQXBwcm9hY2ggMyAoc291cmNlIGxpbmspDQoNCg0KDQo/Pz8gIA0KDQojIyBLZXkgcG9saWN5IGVzdGltYXRlcyBmb3IgcG9saWN5IG1ha2VycyAgDQpgYGB7cn0NCiNteSB0aG91Z2h0czogc2hvdWxkIHdlIGZvcmVmcm9udCB0aGUgY29uY2x1c2lvbnMgYmVmb3JlIHRoZSBtZXRob2RvbG9neT8gDQoNCiNTYW5kcmE6IEkgdGhpbmsgd2Ugc2hvdWxkIHNwZWNpZnkgd2hpY2ggYXBwcm9hY2ggd2UgdXNlIHRvIGdlbmVyYXRlIHRoZSBncmFwaCwgYnV0IGtlZXAgdGhlIG1ldGhvZG9sb2d5IGJlZm9yZSB0aGUgY29uY2x1c2lvbnMuIA0KYGBgDQoNCmBgYHtyIGZpbmFsLW91dHB1dH0NCmBgYA0KPz8/DQoNCiMgTWV0aG9kb2xvZ3kNCg0KRXhwbGFpbiB3aGF0IHRoZSBmaW5hbCBlc3RpbWF0ZSBpbmRpY2F0b3IgaXMsIGhvdyB0aGUgYW5hbHlzaXMgaXMgdG8gYmUgcGVyZm9ybWVkLCB3aGF0IGZhY3RvcnMgYXJlIGxvb2tlZCBhdCwgZXRjLg0KDQojIyBDb21tb24gU3RydWN0dXJlDQoNCkludHJvZHVjZSB0aGUgc3RhcnRpbmcgcG9pbnQgYW5kIHRoZSBmaW5hbCBwb2xpY3kgZXN0aW1hdGUuIEluY2x1ZGUgYWx0ZXJuYXRpdmUgaW5kaWNhdG9ycyBvZiBvdXIgZmluYWwgcG9saWN5IGVzdGltYXRlcyBhcyB3ZWxsLiAgDQoNCiMjIyBNYWluIEVxdWF0aW9uICh0aGUgbW9kZWwpDQoNCkV4cGxhbmF0aW9uIGZvciB0aGUgbWFpbiBlcXVhdGlvbiANCg0KPGRldGFpbHM+PHN1bW1hcnk+U2hvdyBhbGwgdGhlIGRldGFpbHM8L3N1bW1hcnk+DQpcYmVnaW57ZXF1YXRpb259DQp5ID0gciArIHEgLSBrDQpcbGFiZWx7ZXE6MX0NClx0YWd7MX0NClxlbmR7ZXF1YXRpb259DQoNCldoZXJlOiANCg0KLSAkeSQ6IG9uZS1saW5lciB0byBkZWZpbmUgeQ0KLSAkciQ6IG9uZS1saW5lciB0byBkZWZpbmUgcg0KLSAkayQ6IG9uZS1saW5lciB0byBkZWZpbmUgaw0KDQo8L2RldGFpbHM+DQoNCg0KDQojIyMgQWx0ZXJuYXRpdmUgRXF1YXRpb24NCg0KRXhwbGFuYXRpb24gZm9yIHRoZSBhbHRlcm5hdGl2ZSBlcXVhdGlvbiANCg0KPGRldGFpbHM+PHN1bW1hcnk+U2hvdyBhbGwgdGhlIGRldGFpbHM8L3N1bW1hcnk+DQpcYmVnaW57ZXF1YXRpb259DQp5ID0gciArIHEgKyBrDQpcbGFiZWx7ZXE6Mn0NClx0YWd7Mn0NClxlbmR7ZXF1YXRpb259DQoNCldoZXJlOg0KDQotICR5JDogb25lLWxpbmVyIHRvIGRlZmluZSB5DQotICRyJDogb25lLWxpbmVyIHRvIGRlZmluZSByDQotICRrJDogb25lLWxpbmVyIHRvIGRlZmluZSBrDQoNCmBgYHtyIHRlc3QsIGV2YWw9VFJVRX0NCiMgLSBpbnB1dHM6IA0KIyAtIG91dHB1dHM6IA0KY2h1bmtfdGVzdCA8LSBmdW5jdGlvbigpew0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyANCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIA0KICANCiAgICAjIHJhbmRvbSBlcXVhdGlvbiB0byB1c2UgYXMgb3VyIG1haW4gZXF1YXRpb24gdG8gZ2V0IHRoZSBmaW5hbCByZXN1bHQNCiAgICBtYWluZXF1YXRpb25fZiA8LSBmdW5jdGlvbihyX2ZpbmFsX3ZhciA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcV9maW5hbF92YXIgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtfZmluYWxfdmFyID0gMSkgew0KICAgICAgICByZXR1cm4gKHJfZmluYWxfdmFyICsgcV9maW5hbF92YXIgLSBrX2ZpbmFsX3ZhcikNCiAgICB9DQogICAgDQogICAgIyByYW5kb20gZXF1YXRpb24gdG8gdXNlIGFzIG91ciBhbHRlcm5hdGl2ZSBlcXVhdGlvbiB0byBnZXQgdGhlIGZpbmFsIHJlc3VsdA0KICAgIGFsdGVybmF0aXZlX2YgPC0gZnVuY3Rpb24oIHJfZmluYWxfdmFyID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxX2ZpbmFsX3ZhciA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga19maW5hbF92YXIgPSAxKXsNCiAgICAgIHJldHVybiAocl9maW5hbF92YXIgKyBxX2ZpbmFsX3ZhciArIGtfZmluYWxfdmFyKQ0KICAgICAgDQogICAgfQ0KICAgIA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyANCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIA0KICAgIHJldHVybihsaXN0KCJtYWluZXF1YXRpb25fZiIgPSBtYWluZXF1YXRpb25fZiwgImFsdGVybmF0aXZlX2YiID0gYWx0ZXJuYXRpdmVfZikpICAgICMgVHJ5IHRvIHJldHVybiBvbmx5IGZ1bmN0aW9ucw0KfQ0KaW52aXNpYmxlKCBsaXN0MmVudihjaHVua190ZXN0KCksLkdsb2JhbEVudikgKQ0KDQojIyMjIyBFeGVjdXRlIHZhbHVlcyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIHdoZW4gbmVlZGVkIGZvciB0aGUgdGV4dDoNCm1haW5lcXVhdGlvbl9pbiA8LSBtYWluZXF1YXRpb25fZigpDQphbHRlcm5hdGl2ZV9pbiA8LSBhbHRlcm5hdGl2ZV9mKCkNCmBgYA0KDQoNCjwvZGV0YWlscz4NCg0KIyMgU3ViIENvbW1vbiBDb21wb25lbnRzOg0KDQojIyMgQ29tcG9uZW50IDEgKCIkciQiKQ0KDQpUaGlzIGlzIHRoZSBmb3JtdWxhIHVzZWQgdG8gY2FsY3VsYXRlIGNvbXBvbmVudCAxW14xXQ0KDQo8ZGV0YWlscz48c3VtbWFyeT5TaG93IGFsbCB0aGUgZGV0YWlsczwvc3VtbWFyeT4NClxiZWdpbntlcXVhdGlvbn0NCnIgPSBYIFx0aW1lcyBcbGFtYmRhXzEgICsgKDEgLSBYKSBcdGltZXMgXGxhbWJkYV8yDQpcbGFiZWx7ZXE6M30NClx0YWd7M30NClxlbmR7ZXF1YXRpb259DQoNCldoZXJlOiANCg0KLSAkciQ6IG9uZS1saW5lciBmb3Igcg0KLSAkWCQ6IG9uZS1saW5lciBmb3IgWA0KLSAkXGxhbWJkYV8xJDogb25lLWxpbmVyIGZvciAkXGxhbWJkYV8xJA0KLSAkXGxhbWJkYV8yJDogb25lLWxpbmVyIGZvciAkXGxhbWJkYV8yJA0KDQpgYGB7ciBjb21wMSwgIGVjaG89cHJpbnRfY29kZSwgZXZhbD1UUlVFfQ0KIyAtIGlucHV0czogZmFjdG9ycyBvZiByDQojIC0gb3V0cHV0czogciB2YWx1ZQ0KY2h1bmtfciA8LSBmdW5jdGlvbigpew0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgDQoNCiAgICByX2Z1bmN0aW9uX2YgPC0gZnVuY3Rpb24ocl9pbnB1dDFfdmFyID0gcl9pbnB1dDFfc28gLCByX2lucHV0Ml92YXIgPSByX2lucHV0Ml9zbykgeyAgDQogICAgICAgIHJfaW5wdXQxX3ZhciAtIHJfaW5wdXQyX3Zhcg0KICAgICAgICANCiAgICB9DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIA0KICAgIHJldHVybihsaXN0KCJyX2Z1bmN0aW9uX2YiID0gcl9mdW5jdGlvbl9mKSkNCn0NCg0KaW52aXNpYmxlKCBsaXN0MmVudihjaHVua19yKCksLkdsb2JhbEVudikgKQ0KDQpgYGANCjwvZGV0YWlscz4NCg0KIyMgQXBwcm9hY2ggMTogU291cmNlIE5hbWUgKHNvdXJjZSBsaW5rKQ0KIyMjIENvbXBvbmVudCAyICgiJHEkIikNCg0KVGhpcyBpcyB0aGUgZm9ybXVsYSB1c2VkIHRvIGNhbGN1bGF0ZSBjb21wb25lbnQgMlteMl0NCg0KPGRldGFpbHM+PHN1bW1hcnk+U2hvdyBhbGwgdGhlIGRldGFpbHM8L3N1bW1hcnk+DQpcYmVnaW57ZXF1YXRpb259DQpxID0gIFx0ZXh0e2lucHV0fSBcdGltZXMgXGFscGhhXzAgKDEgKyBnKV57WH0oMSArIFxoYXR7XGJldGFfMX0gWCArIFxoYXR7XGJldGFfMn0gWF4yKQ0KXGxhYmVse2VxOn0NClx0YWd7NH0NClxlbmR7ZXF1YXRpb259DQoNCldoZXJlOiANCg0KLSAkcSQ6IG9uZS1saW5lciB0byBkZWZpbmUgcQ0KLSAkXGFscGhhXzAkOiBvbmUtbGluZXIgdG8gZGVmaW5lICRcYWxwaGFfMCQNCi0gJGckOiBvbmUtbGluZXIgdG8gZGVmaW5lIGcNCi0gJFxoYXR7XGJldGFfMX0kOiBvbmUtbGluZXIgdG8gZGVmaW5lICRcaGF0e1xiZXRhXzF9JA0KLSAkXGhhdHtcYmV0YV8yfSQ6IG9uZS1saW5lciB0byBkZWZpbmUgJFxoYXR7XGJldGFfMn0kDQoNCg0KYGBge3IgY29tcDIsICBlY2hvPXByaW50X2NvZGUsIGV2YWw9VFJVRX0NCiMgLSBpbnB1dHM6IGZhY3RvcnMgb2YgcQ0KIyAtIG91dHB1dHM6IHEgdmFsdWUNCmNodW5rX3EgPC0gZnVuY3Rpb24oKXsNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIA0KDQogICAgcV9mdW5jdGlvbl9mIDwtIGZ1bmN0aW9uKHFfaW5wdXQxX3ZhciA9IHFfaW5wdXQxX3NvICwgcV9pbnB1dDJfdmFyID0gcV9pbnB1dDJfc28pIHsgIA0KICAgICAgICAocV9pbnB1dDFfdmFyICogcV9pbnB1dDJfdmFyKV4yDQogICAgICAgIA0KICAgIH0NCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgDQogICAgcmV0dXJuKGxpc3QoInFfZnVuY3Rpb25fZiIgPSBxX2Z1bmN0aW9uX2YpKQ0KfQ0KDQppbnZpc2libGUoIGxpc3QyZW52KGNodW5rX3EoKSwuR2xvYmFsRW52KSApDQoNCmBgYA0KPC9kZXRhaWxzPg0KDQojIyBBcHByb2FjaCAyOiBTb3VyY2UgTmFtZSAoc291cmNlIGxpbmspDQojIyMgQ29tcG9uZW50IDMgKCIkayQiKQ0KDQpUaGlzIGlzIHRoZSBmb3JtdWxhIHVzZWQgdG8gY2FsY3VsYXRlIGNvbXBvbmVudCAzW14zXQ0KDQo8ZGV0YWlscz48c3VtbWFyeT5TaG93IGFsbCB0aGUgZGV0YWlsczwvc3VtbWFyeT4NClxiZWdpbntlcXVhdGlvbn0NCmsgPSBSIFx0aW1lcyBYICArICgxIC0gUikgXHRpbWVzIFgNClxsYWJlbHtlcTo1fQ0KXHRhZ3s1fQ0KXGVuZHtlcXVhdGlvbn0NCg0KV2hlcmU6DQoNCi0gJGskOiBvbmUtbGluZXIgdG8gZGVmaW5lIGsNCi0gJFIkOiBvbmUtbGluZXIgdG8gZGVmaW5lIFINCg0KDQpgYGB7ciBjb21wMywgIGVjaG89cHJpbnRfY29kZSwgZXZhbD1UUlVFfQ0KIyAtIGlucHV0czogZmFjdG9ycyBvZiBxDQojIC0gb3V0cHV0czogcSB2YWx1ZQ0KY2h1bmtfayA8LSBmdW5jdGlvbigpew0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgDQoNCiAgICBrX2Z1bmN0aW9uX2YgPC0gZnVuY3Rpb24oa19pbnB1dDFfdmFyID0ga19pbnB1dDFfc28gLCBrX2lucHV0Ml92YXIgPSBrX2lucHV0Ml9zbykgeyAgDQogICAgICAgIChrX2lucHV0MV92YXIgKiBrX2lucHV0Ml92YXIpXjINCiAgICAgICAgDQogICAgfQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICANCiAgICByZXR1cm4obGlzdCgia19mdW5jdGlvbl9mIiA9IGtfZnVuY3Rpb25fZikpDQp9DQoNCmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfaygpLC5HbG9iYWxFbnYpICkNCg0KDQpgYGANCg0KPC9kZXRhaWxzPg0KIyMgU3VtbWFyeSBvZiBBbGwgQXBwcm9hY2hlcyANCg0KDQp8IEFwcHJvYWNoICAgIHwgUGFydCAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBhcnQgMiAgICAgICAgfA0KfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfA0KfCAxLjEgfCBTcGVjaWZpY2F0aW9uIG9mIEFwcHJvYWNoIDEgd2l0aCBQYXJ0IDEgQXNzdW1wdGlvbiAxIHwgU3BlY2lmaWNhdGlvbiBvZiBBcHByb2FjaCAxIHdpdGggUGFydCAyIEFzc3VtcHRpb24gMSAgfA0KfCAxLjIgfCBTcGVjaWZpY2F0aW9uIG9mIEFwcHJvYWNoIDEgd2l0aCBQYXJ0IDEgQXNzdW1wdGlvbiAyIHwgU3BlY2lmaWNhdGlvbiBvZiBBcHJyb2FjaCAxIHdpdGggUGFydCAyIEFzc3VtcHRpb24gMiAgfA0KfCAyLjEgfCBTcGVjaWZpY2F0aW9uIG9mIEFwcHJvYWNoIDIgd2l0aCBQYXJ0IDEgQXNzdW1wdGlvbiAxIHwgU3BlY2lmaWNhdGlvbiBvZiBBcHByb2FjaCAyIHdpdGggUGFydCAyIEFzc3VtcHRpb24gMSB8DQp8ICoqMi4yKiogfCAqKlNwZWNpZmljYXRpb24gb2YgQXBwcm9hY2ggMiB3aXRoIFBhcnQgMSBBc3N1bXB0aW9uIDIqKiB8ICoqU3BlY2lmaWNhdGlvbiBvZiBBcHByb2FjaCAyIHdpdGggUGFydCAyIEFzc3VtcHRpb24gMioqfA0KDQpCb2xkZWQgcm93IGlzIHRoZSBhc3N1bXB0aW9ucyBhbmQgdGhlIGFwcHJvYWNoIHdlIHVzZSB0byBnZW5lcmF0ZSB0aGUgbWFpbiBwb2xpY3kgZXN0aW1hdGUgcGxvdC4gDQoNCg0KIyBNYWluIHJlc3VsdHMNCjxkZXRhaWxzPjxzdW1tYXJ5PlNob3cgYWxsIHRoZSBkZXRhaWxzPC9zdW1tYXJ5Pg0KYGBge3IgYWxsLXN0ZXBzLCAgZWNobz1wcmludF9jb2RlLCBldmFsID0gVFJVRX0NCiN1bml0IHRlc3QgZnVuY3Rpb24NCnVuaXRfdGVzdF9mIDwtIGZ1bmN0aW9uKHRvX3Rlc3RfdmFyLCBvcmlnaW5hbF92YXIsIG1haW5fcnVuX3ZhciA9IFRSVUUpew0KICAgIGlmIChtYWluX3J1bl92YXIgPT0gVFJVRSkgew0KICAgICAgICBpZiAobGVuZ3RoKHRvX3Rlc3RfdmFyKSA+IDEpIHsNCiAgICAgICAgICAgIGZhaWxzX3Rlc3QgPC0gKCBhYnMoc2QodG9fdGVzdF92YXIpIC0gb3JpZ2luYWxfdmFyKSA+IDAuMDAwMSApDQogICAgICAgICAgICB0ZXh0X3ZhbCA8LSBzZCh0b190ZXN0X3ZhcikNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGZhaWxzX3Rlc3QgPC0gKCBhYnModG9fdGVzdF92YXIgLSBvcmlnaW5hbF92YXIpID4gMC4wMDAxICkNCiAgICAgICAgICAgIHRleHRfdmFsIDwtIHRvX3Rlc3RfdmFyDQogICAgICAgIH0NCiAgICAgICAgaWYgKGZhaWxzX3Rlc3QpIHsNCiAgICAgICAgICAgIHByaW50KHBhc3RlKCJPdXRwdXQgaGFzIGNoYW5nZSBhdCIsDQogICAgICAgICAgICAgICAgICAgICAgICBkZXBhcnNlKHN1YnN0aXR1dGUodG9fdGVzdF92YXIpICksDQogICAgICAgICAgICAgICAgICAgICAgICAiIHRvICIsIHRleHRfdmFsKSApDQogICAgICAgIH0NCiAgICAgIH0NCn0NCg0Kb25lX3J1biA8LSANCiAgZnVuY3Rpb24ocl9pbnB1dDFfdmFyMSA9IHJfaW5wdXQxX3NvLCANCiAgICAgICAgICAgcl9pbnB1dDJfdmFyMSA9IHJfaW5wdXQyX3NvLCANCiAgICAgICAgICAgcV9pbnB1dDFfdmFyMSA9IHFfaW5wdXQxX3NvLA0KICAgICAgICAgICBxX2lucHV0Ml92YXIxID0gcV9pbnB1dDJfc28sDQogICAgICAgICAgIGtfaW5wdXQxX3ZhcjEgPSBrX2lucHV0MV9zbywNCiAgICAgICAgICAga19pbnB1dDJfdmFyMSA9IGtfaW5wdXQyX3NvKXsjIFZhcmlhYmxlcyBuZWVkZWQgdG8gZ2VuZXJhdGUgdGhlIGZpbmFsIHBvbGljeSBlc3RpbWF0ZXMNCiAgICANCiAgICByX2luIDwtIHJfZnVuY3Rpb25fZihyX2lucHV0MV92YXIgPSByX2lucHV0MV92YXIxLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHJfaW5wdXQyX3ZhciA9IHJfaW5wdXQyX3ZhcjEpDQogICAgcV9pbiA8LSBxX2Z1bmN0aW9uX2YocV9pbnB1dDFfdmFyID0gcV9pbnB1dDFfdmFyMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBxX2lucHV0Ml92YXIgPSBxX2lucHV0Ml92YXIxKQ0KICAgIGtfaW4gPC0ga19mdW5jdGlvbl9mKGtfaW5wdXQxX3ZhciA9IGtfaW5wdXQxX3ZhcjEsDQogICAgICAgICAgICAgICAgICAgICAgICAga19pbnB1dDJfdmFyID0ga19pbnB1dDJfdmFyMSkNCiAgICByZXR1cm4gKGxpc3QoInJfaW4iID0gcl9pbiwNCiAgICAgICAgICAgICAgICAgInFfaW4iID0gcV9pbiwNCiAgICAgICAgICAgICAgICAgImtfaW4iID0ga19pbikpDQogICAgICAgICAgIH0NCiAgICANCmludmlzaWJsZShsaXN0MmVudihvbmVfcnVuKCksIC5HbG9iYWxFbnYpKQ0KDQogICAgDQpgYGANCg0KPC9kZXRhaWxzPg0KYGBge3IgbWFpbi1yZXN1bHRzLCAgZWNobz1wcmludF9jb2RlLCBldmFsID0gVFJVRX0NCiMgLSBwZXJmb3JtIHRoZSBjYWxjdWxhdGlvbnMgdG8gYWNoaWV2ZSBmaW5hbCByZXN1bHRzDQoNCnJlc3VsdDEgPC0gbWFpbmVxdWF0aW9uX2Yocl9maW5hbF92YXIgPSByX2luLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBxX2ZpbmFsX3ZhciA9IHFfaW4sDQogICAgICAgICAgICAgICAgICAgICAgICAgIGtfZmluYWxfdmFyID0ga19pbikNCnJlc3VsdDIgPC0gYWx0ZXJuYXRpdmVfZihyX2ZpbmFsX3ZhciA9IHJfaW4sDQogICAgICAgICAgICAgICAgICAgICAgICAgIHFfZmluYWxfdmFyID0gcV9pbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAga19maW5hbF92YXIgPSBrX2luKQ0KIy4uLg0KDQpyZXN1bHRzX3RhYmxlIDwtIGRhdGEuZnJhbWUoInJlc3VsdHMxIiA9ICAgYygicmVzdWx0cyIsIE5BLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpICwNCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXN1bHRzMiIgPSAgYyhOQSwgInJlc3VsdHMiLCBOQSksDQogICAgICAgICAgICAgICAgICAgICAgICAicmVzdWx0czMiID0gYygicmVzdWx0cyIsIE5BLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlc3VsdHMiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgcm93Lm5hbWVzID0gYygic2l0dWF0aW9uMSIsICJzaXR1YXRpb24yIiwgInNpdHVhdGlvbjMiKSkNCg0Ka2FibGUocmVzdWx0c190YWJsZSwgY2FwdGlvbiA9ICJUYWJsZSBDYXB0aW9uIikgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRikNCmBgYA0KDQoNCmBgYHtyIGdlbmVyYXRlLXBsb3QtZnVuY3Rpb24sIHB1cmwgPSBUUlVFLCBlY2hvID0gRkFMU0V9DQojIGdlbmVyYXRlX3Bsb3RfZjogZnVuY3Rpb24gdG8gZ2VuZXJhdGUgcGxvdHMgZm9yIGJvdGggRHluYW1pYyBEb2N1bWVudCBhbmQNCiMgc2hpbnkgYXBwLiBJdCB0YWtlcyBpbiB0aGUgc2ltdWxhdGVkIGRhdGEsIHBvbGljeSBlc3RpbWF0ZSB0ZXh0LCBhbmQgcmVzY2FsZQ0KIyB2YXJpYWJsZS4gVGhlc2UgYXJlIGludGVybWVkaWFyeSB2YXJpYWJsZXMgdG8gZXhjbHVkZSB0aGUgaW50ZXJhY3Rpdml0eSBvZg0KIyBzaGlueSBhcHAgZnJvbSB0aGUgcGxvdCBnZW5lcmF0aW9uIHByb2Nlc3MuICANCmNodW5rX2dlbmVyYXRlX3Bsb3QgPC0gZnVuY3Rpb24oKSB7DQogIGdlbmVyYXRlX3Bsb3RfZiA8LSBmdW5jdGlvbihyZXN1bHQxX3NpbV9hbGwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lfZXN0aW1hdGVzX3RleHRfc2VsZWN0ZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNjYWxlLCBTRCA9IEZBTFNFKXsNCiAgICB0b3RhbF90aW1lX3NpbSA8LSByZXN1bHQxX3NpbV9hbGwkdG90YWxfdGltZV9zaW0NCiAgICBwb3NpdGlvbiA8LSB3aGljaCggcG9saWN5X2VzdGltYXRlc190ZXh0ID09IHBvbGljeV9lc3RpbWF0ZXNfdGV4dF9zZWxlY3RlZCkNCiAgICByZXN1bHQxX3NpbSA8LSByZXN1bHQxX3NpbV9hbGxbWyBwb2xpY3lfZXN0aW1hdGVzX3Zhcm5hbWVzW3Bvc2l0aW9uXSBdXSAgICANCiAgICByZXN1bHQxX2Zvcl90ZXh0IDwtIHBhc3RlKCJNZWRpYW4gTlBWOiAiLCByb3VuZChtZWRpYW4ocmVzdWx0MV9zaW0pLCAyKSkNCiAgICByZXN1bHQxX2Zvcl90ZXh0MiA8LSBOVUxMDQogICAgaWYgKFNEKXsNCiAgICByZXN1bHQxX2Zvcl90ZXh0MiA8LSBwYXN0ZSgiU0QgTlBWOiAiLCByb3VuZChzZChyZXN1bHQxX3NpbSksIDIpKQ0KICAgIH0NCiAgICBwbG90MSA8LSBnZ3Bsb3QoKSArDQogICAgICBnZW9tX2RlbnNpdHkoDQogICAgICAgIGFlcyh4ID0gcmVzdWx0MV9zaW0sDQogICAgICAgICAgICBhbHBoYSA9IDEgLyAyLCAuLnNjYWxlZC4uKSwNCiAgICAgICAga2VybmVsID0gImdhdSIsDQogICAgICAgIGx3ZCA9IDEsDQogICAgICAgIGZpbGwgPSAiIzAwN2JhNyIsDQogICAgICAgIGNvbG9yID0gImRhcmtibHVlIiwNCiAgICAgICAgYWxwaGEgPSAwLjMNCiAgICAgICkgKw0KICAgICAgZ2VvbV92bGluZSgNCiAgICAgICAgeGludGVyY2VwdCA9IGMoMCwgbWVkaWFuKHJlc3VsdDFfc2ltKSksDQogICAgICAgIGNvbCA9IGMoImJsYWNrIiwgImRhcmtibHVlIiksDQogICAgICAgIGx3ZCA9IGMoMSwgMSksDQogICAgICAgIGxpbmV0eXBlID0gYygic29saWQiLCAiZGFzaGVkIikNCiAgICAgICkgKw0KICAgICAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKC0zMDAsMTAwMCksICB5bGltID0gIGMoIDAsIDEuMiApKSAgKyAgIyBmaXhpbmcgdGhlIHggYXhpcyBzbyBzaGlmdHMgaW4gdGhlIGRlbnNpdHkgY2FuIGJlIHNlZW4NCiAgICAgICN4bGltKHJhbmdlKGRlbnNpdHkocmVzdWx0MV9zaW0pJHgpKSArDQogICAgICBndWlkZXMoYWxwaGEgPSAibm9uZSIsIGNvbG91ciA9ICJub25lIikgKw0KICAgICAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLCAwKSkpICsNCiAgICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwgMCkpKSArDQogICAgICBhbm5vdGF0ZSgNCiAgICAgICAgInRleHQiLA0KICAgICAgICB4ID0gMSAqIG1lZGlhbihyZXN1bHQxX3NpbSksDQogICAgICAgIHkgPSAwLjIsDQogICAgICAgIGxhYmVsID0gcmVzdWx0MV9mb3JfdGV4dCwNCiAgICAgICAgc2l6ZSA9IDYsDQogICAgICAgIGNvbG9yID0gImRhcmtibHVlIg0KICAgICAgKSArDQogICAgICBhbm5vdGF0ZSgNCiAgICAgICAgInRleHQiLA0KICAgICAgICB4ID0gMSAqIG1lZGlhbihyZXN1bHQxX3NpbSksDQogICAgICAgIHkgPSAwLjEsDQogICAgICAgIGxhYmVsID0gcmVzdWx0MV9mb3JfdGV4dDIsDQogICAgICAgIHNpemUgPSA2LA0KICAgICAgICBjb2xvciA9ICJkYXJrYmx1ZSINCiAgICAgICkgKw0KICAgICAgdGhlbWUoDQogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLA0KICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEuNSkNCiAgICAgICkNCg0KICAgIGlmIChyZXNjYWxlID09IFRSVUUpIHsNCiAgICAgIHBsb3QxIDwtDQogICAgICAgIHN1cHByZXNzTWVzc2FnZXMocGxvdDEgKyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IDEuMiAqIGMobWluKGMoDQogICAgICAgICAgLTEsIHJlc3VsdDFfc2ltDQogICAgICAgICkpLCBtYXgoYygNCiAgICAgICAgICAxMDAsIHJlc3VsdDFfc2ltDQogICAgICAgICkpKSkpDQogICAgfQ0KICAgIHJldHVybiAobGlzdChwbG90MSxwb3NpdGlvbix0b3RhbF90aW1lX3NpbSkpDQp9DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJldHVybihsaXN0KCJnZW5lcmF0ZV9wbG90X2YiID0gZ2VuZXJhdGVfcGxvdF9mKSkNCn0NCg0KaW52aXNpYmxlKCBsaXN0MmVudihjaHVua19nZW5lcmF0ZV9wbG90KCksLkdsb2JhbEVudikgKQ0KYGBgDQoNCiMgTW9udGUgQ2FybG8gU2ltdWxhdGlvbnMgIA0KYGBge3IgbWMtc2V0dXAsICBlY2hvPXByaW50X2NvZGUsIGV2YWwgPSBUUlVFfQ0KDQpzaW1fZGF0YTFfZiA8LSBmdW5jdGlvbihuc2ltcyA9IDFlMiwNCiAgICAgICAgICAgICAgICAgICAgICByX2lucHV0MV92YXIyLA0KICAgICAgICAgICAgICAgICAgICAgIHJfaW5wdXQxX3ZhcjJfc2QsDQogICAgICAgICAgICAgICAgICAgICAgcl9pbnB1dDJfdmFyMiwNCiAgICAgICAgICAgICAgICAgICAgICByX2lucHV0Ml92YXIyX3NkLA0KICAgICAgICAgICAgICAgICAgICAgIHFfaW5wdXQxX3ZhcjIsDQogICAgICAgICAgICAgICAgICAgICAgcV9pbnB1dDFfdmFyMl9zZCwNCiAgICAgICAgICAgICAgICAgICAgICBxX2lucHV0Ml92YXIyLA0KICAgICAgICAgICAgICAgICAgICAgIHFfaW5wdXQyX3ZhcjJfc2QsDQogICAgICAgICAgICAgICAgICAgICAga19pbnB1dDFfdmFyMiwNCiAgICAgICAgICAgICAgICAgICAgICBrX2lucHV0MV92YXIyX3NkLA0KICAgICAgICAgICAgICAgICAgICAgIGtfaW5wdXQyX3ZhcjIsDQogICAgICAgICAgICAgICAgICAgICAga19pbnB1dDJfdmFyMl9zZCl7DQogICAgIyMjIyMjIyMjIyMjIyMjIw0KICAgICMjIyMjIyBEcmF3cyAgIA0KICAgICMjIyMjIyMjIyMjIyMjIyMgIA0KICBzdGFydF90aW1lIDwtIFN5cy50aW1lKCkNCiAgc2V0LnNlZWQoMTQyODU3KQ0KICByMV9zaW0gPC0gcm5vcm0obiA9IG5zaW1zLCBtZWFuID0gcl9pbnB1dDFfdmFyMiwgc2Q9IHJfaW5wdXQxX3ZhcjJfc2QpDQogIHIyX3NpbSA8LSBybm9ybShuID0gbnNpbXMsIG1lYW4gPSByX2lucHV0Ml92YXIyLCBzZD0gcl9pbnB1dDJfdmFyMl9zZCkNCiAgcTFfc2ltIDwtIHJub3JtKG4gPSBuc2ltcywgbWVhbiA9IHFfaW5wdXQxX3ZhcjIsIHNkPSBxX2lucHV0MV92YXIyX3NkKQ0KICBxMl9zaW0gPC0gcm5vcm0obiA9IG5zaW1zLCBtZWFuID0gcV9pbnB1dDJfdmFyMiwgc2Q9IHFfaW5wdXQyX3ZhcjJfc2QpDQogIGsxX3NpbSA8LSBybm9ybShuID0gbnNpbXMsIG1lYW4gPSBrX2lucHV0MV92YXIyLCBzZD0ga19pbnB1dDFfdmFyMl9zZCkNCiAgazJfc2ltIDwtIHJub3JtKG4gPSBuc2ltcywgbWVhbiA9IGtfaW5wdXQyX3ZhcjIsIHNkPSBrX2lucHV0Ml92YXIyX3NkKQ0KICANCiAgDQogIA0KICAgICAgICAgICAgICAgICAgICAgIA0KDQogICAgIyMjIyMjIyMjIyMjIyMjIw0KICAgICMjIyMjIyBSdW5zICAgIA0KICAgICMjIyMjIyMjIyMjIyMjIyMNCg0KICByZXN1bHQxX3NpbSA8LSByZXAoTkEsIG5zaW1zKSAjcmVzdWx0MQ0KICByZXN1bHQyX3NpbSA8LSByZXAoTkEsIG5zaW1zKSAjcmVzdWx0Mg0KICANCiAgZm9yIChpIGluIDE6bnNpbXMpew0KICAgIGludmlzaWJsZShsaXN0MmVudigNCiAgICAgIG9uZV9ydW4ocl9pbnB1dDFfdmFyMSA9IHIxX3NpbVtpXSwNCiAgICAgICAgICAgICAgcl9pbnB1dDJfdmFyMSA9IHIyX3NpbVtpXSwNCiAgICAgICAgICAgICAgcV9pbnB1dDFfdmFyMSA9IHExX3NpbVtpXSwNCiAgICAgICAgICAgICAgcV9pbnB1dDJfdmFyMSA9IHEyX3NpbVtpXSwNCiAgICAgICAgICAgICAga19pbnB1dDFfdmFyMSA9IGsxX3NpbVtpXSwNCiAgICAgICAgICAgICAga19pbnB1dDJfdmFyMSA9IGsyX3NpbVtpXQ0KICAgICAgICAgICAgICApLCAuR2xvYmFsRW52KSkNCiAgICANCiAgICByZXN1bHQxX3NpbVtpXSA8LSBtYWluZXF1YXRpb25fZihyX2ZpbmFsX3ZhciA9IHJfaW4sDQogICAgICAgICAgICAgICAgICAgICAgICAgIHFfZmluYWxfdmFyID0gcV9pbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAga19maW5hbF92YXIgPSBrX2luKQ0KICAgIHJlc3VsdDJfc2ltW2ldIDwtIGFsdGVybmF0aXZlX2Yocl9maW5hbF92YXIgPSByX2luLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBxX2ZpbmFsX3ZhciA9IHFfaW4sDQogICAgICAgICAgICAgICAgICAgICAgICAgIGtfZmluYWxfdmFyID0ga19pbikNCiAgfQ0KICAgIHRvdGFsX3RpbWUgPC0gU3lzLnRpbWUoKSAtIHN0YXJ0X3RpbWUNCiAgICByZXR1cm4obGlzdCgicmVzdWx0MV9zaW0iID0gcmVzdWx0MV9zaW0sDQogICAgICAgICAgICAgICAgInJlc3VsdDJfc2ltIiA9IHJlc3VsdDJfc2ltKSkNCiAgDQogIA0KfQ0KDQpwb2xpY3lfZXN0aW1hdGVzX3Zhcm5hbWVzIDwtIGMoDQogICJyZXN1bHQxX3NpbSIsDQogICJyZXN1bHQyX3NpbSINCikNCg0KcG9saWN5X2VzdGltYXRlc190ZXh0IDwtIGMoDQogICJNYWluIEVxdWF0aW9uIiwNCiAgIkFsdGVybmF0aXZlIEVxdWF0aW9uIg0KKQ0KDQpgYGANCg0KYGBge3IgbWMtcnVuLCBkcGkgPSA0MDAsIGVjaG8gPSBwcmludF9jb2RlLCBldmFsID0gVFJVRX0NCiMgUnVuIE1vbnRlIENhcmxvIHNpbXVsYXRpb24gZm9yIG91ciBtYWluIG1vZGVsDQpyZXN1bHQxX3NpbV9hbGwgPC0gc2ltX2RhdGExX2YobnNpbXMgPSBuc2ltc19zbywgDQogICAgICAgICAgICAgICAgICAgICAgcl9pbnB1dDFfdmFyMiA9IHJfaW5wdXQxX3NvLA0KICAgICAgICAgICAgICAgICAgICAgIHJfaW5wdXQxX3ZhcjJfc2QgPSByX2lucHV0MV9zbyAqIDAuMSwNCiAgICAgICAgICAgICAgICAgICAgICByX2lucHV0Ml92YXIyID0gcl9pbnB1dDJfc28sDQogICAgICAgICAgICAgICAgICAgICAgcl9pbnB1dDJfdmFyMl9zZCA9IHJfaW5wdXQyX3NvICogMC4xLA0KICAgICAgICAgICAgICAgICAgICAgIHFfaW5wdXQxX3ZhcjIgPSBxX2lucHV0MV9zbywNCiAgICAgICAgICAgICAgICAgICAgICBxX2lucHV0MV92YXIyX3NkID0gcV9pbnB1dDFfc28gKiAwLjEsDQogICAgICAgICAgICAgICAgICAgICAgcV9pbnB1dDJfdmFyMiA9IHFfaW5wdXQyX3NvLA0KICAgICAgICAgICAgICAgICAgICAgIHFfaW5wdXQyX3ZhcjJfc2QgPSBxX2lucHV0Ml9zbyAqIDAuMSwNCiAgICAgICAgICAgICAgICAgICAgICBrX2lucHV0MV92YXIyID0ga19pbnB1dDFfc28sDQogICAgICAgICAgICAgICAgICAgICAga19pbnB1dDFfdmFyMl9zZCA9IGtfaW5wdXQxX3NvICogMC4xLA0KICAgICAgICAgICAgICAgICAgICAgIGtfaW5wdXQyX3ZhcjIgPSBrX2lucHV0Ml9zbywNCiAgICAgICAgICAgICAgICAgICAgICBrX2lucHV0Ml92YXIyX3NkID0ga19pbnB1dDJfc28gKiAwLjENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCg0KDQoNCiMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyBSZXN1bHRzL1Zpeg0KIyMjIyMjIyMjIyMjIyMjIw0KDQoNCmxpYnJhcnkocGxvdGx5KQ0KDQoNCnBsb3QxIDwtIGdlbmVyYXRlX3Bsb3RfZihyZXN1bHQxX3NpbV9hbGwsIHBvbGljeV9lc3RpbWF0ZV9zbywgcmVzY2FsZV9zbylbWzFdXSArDQogICAgICBsYWJzKHkgPSBOVUxMLA0KICAgICAgIHggPSAiTWFpbiBFc3RpbWF0ZSIgLA0KICAgICAgIHRpdGxlID0gIlByb2plY3QgVGl0bGUiLA0KICAgICAgIHN1YnRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBLZXkgSW5kaWNhdG9yIg0KICAgICAgICkgDQpwcmludChwbG90MSkNCmBgYA0KDQoNCg0KDQojIFJlZmVyZW5jZXMNCg0KDQpbXjFdOiBOb3RlcyBvZiByZWZlcmVuY2VkIHNlY3Rpb24NCg0KDQpbXjJdOiBOb3RlcyBvbiByZWZlcmVuY2VkIHNlY3Rpb24NCg0KW14zXTogTm90ZXMgb24gcmVmZXJlbmNlZCBzZWN0aW9uDQo=

An Open Policy Analysis by BITSS
See a full contributors list here
opa@berkeley.edu